//
//  NSObject+Model.m
//  彩票
//
//  Created by 龚昕炜 on 16/6/17.
//  Copyright © 2016年 龚昕炜. All rights reserved.
//

#import "NSObject+Model.h"

#import <objc/runtime.h>

@implementation NSObject (Model)

+ (instancetype)objectWithDictionary:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict
{
    /** 创建调用它的类对象 */
    id object = [[self alloc] init];
    
    unsigned int count = 0;
    
    /** 返回一个调用它的类的属性数组，并返回属性个数count */
    Ivar *ivars = class_copyIvarList(self, &count);
    
    /** 遍历 */
    for (int i = 0; i < count; i++) {

        /** 利用运行时获取数组中各元素 */
        Ivar ivar = ivars[i];
        
        /** 属性转字符串 */
        NSString *ivarName = @(ivar_getName(ivar));
        
        /** 去掉属性名的_ */
        ivarName = [ivarName substringFromIndex:1];
        
        /** 获取字典中当前类去掉下划线的属性名key对应的value */
        id value = dict[ivarName];
        
        /** 遇到为匹配上的key值 */
        if (value == nil) {
            
            /** 映射模型不为空 */
            if (mapDict) {
            
                /** 获取映射模型中的对应字典key的value， */
                /** 如属性名去掉下划线为ID，映射就是 @{ID:id},那么此处就是mapDict[ID],获取的value就是id，那么keyName == @"id"; */
                NSString *keyName = mapDict[ivarName];
                /** value为字典中id对应的value */
                value = dict[keyName];
            }
        }
        /** 用去掉下划线的属性名为key,以字典中对应取出的value为value进行KVC字典转模型 */
        [object setValue:value forKey:ivarName];
    }
    return object;
}

@end
